package main;

import Utils.BeanUtil;
import Utils.DbUtil;
import entity.Student;
import entity.User;
import entity.UserCopy;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @author:wmx 2025-03-19 09:35
 * 1、功能:
 * 2、参数{
 * <p>
 * <p>
 * }
 **/
public class entrance {


    public static void main(String[] args) throws Exception {

         /*
            * 八、使用反射，创建一个学生类型的数组，存放二个学生，循环遍历输出，要求如下：
            1、第一个学生要求使用默认构造方法实例化并使用用 set 方法初始化对象

            2、第二个学生要求使用下面的构造方法实例化对象
                Student(String name,int age,Double score)
            *
            * */
        Object[] studentArray = new Object[2];
        Student student = new Student();
        Class<? extends Student> aClass = student.getClass();//反射类


        Constructor<? extends Student> constructor = aClass.getConstructor();//获取构造方法
        Student newInstance1 = constructor.newInstance();//实例化对象
        newInstance1.setName("小杰");
        newInstance1.setAge(18);
        newInstance1.setScore(80.00);
         Constructor<? extends Student> constructor2 = aClass.getConstructor(String.class,int.class,Double.class);//获取构造方法
         Student newInstance2 = constructor2.newInstance( "小王", 20, 90.00);

            studentArray[0] = newInstance1;
            studentArray[1] = newInstance2;

            for (Object o:studentArray){
                System.out.println(o);
            }



        /*
            九、实现从数据库中查询数据，并自动封装到实体类中，如：
                public class DbUtil{

                    // 学过泛型的 可以把 Object 改为泛型
                    public static Object select4Bean(Class<?> beanClass,Map<String,Object> cond){
                        // 功能实现...
                    }

                }

                要求如下：

                    1、根据参数 beanClass 自动生成查询所有数据的 SQL 语句（上题已实现），

                    2、cond 为查询条件，需要拼接到查询所有数据的后面，如：
                        Map<String,Object> cond = new HashMap<>() ;
                        cond.put("id","1001") ;
                        cond.put("name","张三") ;

                        则拼接的 SQL 语句为：select id,name from user where id=? and name=? ;

                    3、把查询的数据封装到对应的实体对象返回
         */


//                DbUtil dbUtil = new DbUtil();
//                Map<String,Object> cond = new LinkedHashMap() ;
//                cond.put("id","1") ;
//                cond.put("name","123") ;
//
//
//                List<Student> studentList = (List<Student>) dbUtil.select4Bean(aClass,cond);
//                System.out.println(studentList.toString());






        //        十、设计一个方法，基于某个对象自动生成添加数据的 SQL 语句，并把该对象的数据插入到数据库中
        //        public class DbUtil{
        //
        //            public static int insert(User user){
        //                // 功能实现...
        //            }
        //
        //        }

//                User user = new User(3,"小杰");
//                if(DbUtil.insert(user)!=-1){
//                    System.out.println("添加成功");
//                }else{
//                    System.out.println("添加失败");
//                }



        //        十一、定义一个工具类：BeanUtil,有以下三个方法：
        //        1、设置何意对象的属性值
        //        public static void setProperty(Object bean, String propertyName, Object value)
        //
        //        2、获取任意对象的属性值
        //        public static Object getProperty(Object bean, String propertyName)
        //
        //        3、复制某个对象的属性值到另一个对象中
        //        public static void copyProperties(Object source, Object target)

        BeanUtil beanUtil = new BeanUtil();
         User user = new User();
         String propertyName = "id";
         Object value = 1;
        beanUtil.setProperty(user,propertyName,value);
        Object propertyValue = BeanUtil.getProperty(user,propertyName);


        UserCopy userCopy = new UserCopy();
        BeanUtil.copyProperties(user,"id",userCopy,"id");


        System.out.println(user.toString());
        System.out.println(propertyValue);
        System.out.println(userCopy.toString());

    }








}
